/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic.pago;

import static logic.pago.PagoConstants.PAGO_EFECTIVO;
import static logic.pago.PagoConstants.PAGO_TARJETA;

/**
 * @author Lezkus
 */
public abstract class Pago {   
    /**
     * Parsea y devuelve un pago representado como string en s
     * Los campos deberán venir separados con ";"
     * @param s
     * @return 
     */
    public static Pago parsePago(String s) {
        if (s == null || s.isEmpty())
            return null;
        String[] infopago = s.split(";");
        switch(PagoConstants.valueOf(infopago[0])) {
            case PAGO_EFECTIVO: 
                if (infopago.length != 1)
                    throw new IllegalArgumentException("Pago creado incorrectamente");
                return new PagoEfectivo();
            case PAGO_TARJETA: 
                if (infopago.length != 2)
                    throw new IllegalArgumentException("Pago creado incorrectamente");
                return new PagoTarjeta(Integer.parseInt(infopago[1]));
        }

        return null;
    }
    /**
     * Parsea y devuelve un pago completo (con toda la información requerida)
     * @param s
     * @return 
     */
    public static Pago parsePagoCompleto(String s) {
        if (s == null || s.isEmpty())
            return null;
        String[] infopago = s.split(";");
        switch(PagoConstants.valueOf(infopago[0])) {
            case PAGO_EFECTIVO: 
                if (infopago.length != 2)
                    throw new IllegalArgumentException("Pago creado incorrectamente");
                return new PagoEfectivo(Integer.parseInt(infopago[1]));
            case PAGO_TARJETA: 
                if (infopago.length != 3)
                    throw new IllegalArgumentException("Pago creado incorrectamente");
                return new PagoTarjeta(Integer.parseInt(infopago[1]),Integer.parseInt(infopago[2]));
        }

        return null;
    }
    /**
     * Devuelve el gasto asociado al pago
     * @return 
     */
    public abstract int getGasto();
    /**
     * Ajusta el gasto al valor indicado
     * @param i 
     */
    public abstract void setGasto(int i);
    /**
     * Devuelve la cantidad requerida al comprador
     * @param i
     * @return 
     */
    public abstract boolean devuelve(int i);
    /**
     * Efectúa el pago conectando con quien sea necesario
     * @return 
     */
    public abstract boolean efectuar();
    /**
     * Devuelve true si ha sido efectuado o false si no
     * @return 
     */
    public abstract boolean haSidoEfectuado();
    
}
